#include "AppDelegate.h"
#include "scripting/lua-bindings/manual/CCLuaEngine.h"
#include "audio/include/SimpleAudioEngine.h"
#include "cocos2d.h"
#include "scripting/lua-bindings/manual/lua_module_register.h"
#include "audio/include/AudioEngine.h"
#if (CC_TARGET_PLATFORM == CC_PLATFORM_ANDROID)
#ifndef NO_BUGLY
//	#include "bugly/CrashReport.h"
//	#include "bugly/lua/BuglyLuaAgent.h"  
#endif
#elif (CC_TARGET_PLATFORM == CC_PLATFORM_IOS)
//#include "bugly/CrashReport.h"
//#include "bugly/lua/BuglyLuaAgent.h"
#endif
using namespace CocosDenshion;

USING_NS_CC;
using namespace std;

AppDelegate::AppDelegate()
{
}

AppDelegate::~AppDelegate()
{
    SimpleAudioEngine::end();

#if (COCOS2D_DEBUG > 0) && (CC_CODE_IDE_DEBUG_SUPPORT > 0)
    // NOTE:Please don't remove this call if you want to debug with Cocos Code IDE
    RuntimeEngine::getInstance()->end();
#endif

}

// if you want a different context, modify the value of glContextAttrs
// it will affect all platforms
void AppDelegate::initGLContextAttrs()
{
    // set OpenGL context attributes: red,green,blue,alpha,depth,stencil
    GLContextAttrs glContextAttrs = {8, 8, 8, 8, 24, 8};

    GLView::setGLContextAttrs(glContextAttrs);
}

// if you want to use the package manager to install more packages, 
// don't modify or remove this function
static int register_all_packages()
{
    return 0; //flag for packages manager
}

bool AppDelegate::applicationDidFinishLaunching()
{
    // set default FPS
    Director::getInstance()->setAnimationInterval(1.0 / 30.0f);

	// 2d
	Director::getInstance()->setProjection(Director::Projection::_2D);
#if CC_TARGET_PLATFORM == CC_PLATFORM_IOS
    Image::setPVRImagesHavePremultipliedAlpha(true);
#endif

    // register lua module
    auto engine = LuaEngine::getInstance();
    ScriptEngineManager::getInstance()->setScriptEngine(engine);
    lua_State* L = engine->getLuaStack()->getLuaState();
    lua_module_register(L);

    register_all_packages();

    // LuaStack* stack = engine->getLuaStack();
    // stack->setXXTEAKeyAndSign("2dxLua", strlen("2dxLua"), "XXTEA", strlen("XXTEA"));

    //register custom function
    //LuaStack* stack = engine->getLuaStack();
    //register_custom_function(stack->getLuaState());
 #if (CC_TARGET_PLATFORM == CC_PLATFORM_ANDROID)
    #ifndef NO_BUGLY
      //CrashReport::initCrashReport("1e1dfa1778", false);
      //BuglyLuaAgent::registerLuaExceptionHandler(L);  
	#endif

 #endif
    // 进行一次重新生成
    if(FileUtils::getInstance()== nullptr)
    {
        FileUtils::getInstance();
    }
#if CC_64BITS
	FileUtils::getInstance()->addSearchPath(FileUtils::getInstance()->getWritablePath() + "src64");
    FileUtils::getInstance()->addSearchPath("src64");
#endif
	FileUtils::getInstance()->addSearchPath(FileUtils::getInstance()->getWritablePath() + "src");
    FileUtils::getInstance()->addSearchPath("src");
	FileUtils::getInstance()->addSearchPath(FileUtils::getInstance()->getWritablePath() + "res");
    FileUtils::getInstance()->addSearchPath("res");
	FileUtils::getInstance()->addSearchPath(FileUtils::getInstance()->getWritablePath());
    if (engine->executeScriptFile("main.lua"))
    {
        return false;
    }

    return true;
}

// This function will be called when the app is inactive. Note, when receiving a phone call it is invoked.
void AppDelegate::applicationDidEnterBackground()
{
    Director::getInstance()->stopAnimation();

    SimpleAudioEngine::getInstance()->pauseBackgroundMusic();

    experimental::AudioEngine::pauseAll();

    Director::getInstance()->getEventDispatcher()->dispatchCustomEvent("APP_ENTER_BACKGROUND_EVENT");
	auto engine = LuaEngine::getInstance();
	engine->executeGlobalFunction("applicationDidEnterBackground");
}

// this function will be called when the app is active again
void AppDelegate::applicationWillEnterForeground()
{
    Director::getInstance()->startAnimation();

    SimpleAudioEngine::getInstance()->resumeBackgroundMusic();

    experimental::AudioEngine::resumeAll();

    Director::getInstance()->getEventDispatcher()->dispatchCustomEvent("APP_ENTER_FOREGROUND_EVENT");
	auto engine = LuaEngine::getInstance();
	engine->executeGlobalFunction("applicationWillEnterForeground");
}
